import { defineStore } from "pinia";
import { userApi } from '@/api/user';
import type { UserInfo, UserPassLoginParam } from '@/api/user/types'
import { ACCESS_TOKEN } from "./mutation-types";
import { computed, shallowRef } from "vue";



export const useUserStore = defineStore('user', () => {

    const routeData = shallowRef(); // 路由表，用于显示菜单和路由
    const userInfo = shallowRef<UserInfo>(); // 用户信息，用于显示用户信息
    const token = shallowRef<string>(); // 用户token，用于身份验证和权限控制
    const avatar = computed(() => userInfo.value?.avatar); // 用户头像，用于显示用户头像
    const nickname = computed(() => userInfo.value?.nickname); // 用户昵称，用于显示用户昵称
    const roles = computed(() => userInfo.value?.roles); // 用户角色，用于权限控制
    const username = computed(() => userInfo.value?.username); // 用户账号，用于显示用户账号
    const status = computed(() => userInfo.value?.status); // 用户状态，用于显示用户状态
    const userId = computed(() => userInfo.value?.id); // 用户ID，用于标识用户


    const clearUser = () => { // 清除用户信息，用于退出登录
        token.value = ''; // 用户token，用于身份验证和权限控制
        userInfo.value = undefined; // 用户信息，用于显示用户信息
        localStorage.removeItem(ACCESS_TOKEN); // 清除用户token，用于退出登录
    }

    const login = async (data: UserPassLoginParam) => { // 登录，用于身份验证和权限控制
        try {
            const res = await userApi.login(data);
            if (!res) { // 如果登录失败，抛出错误
                throw new Error('登录失败'); // 抛出错误
            }
            if (res?.code !== 200) { // 如果登录失败，抛出错误
                throw new Error(res.message); // 抛出错误
            }
            token.value = res.data.token; // 设置用户token
            localStorage.setItem(ACCESS_TOKEN, res.data.token); // 设置用户token到本地存储，用于持久化
            return res; // 返回登录结果
        } catch (err) {
            clearUser(); // 清除用户信息，用于退出登录
            throw err; // 抛出错误
        }
    };

    const getUserInfo = async () => { // 获取用户信息，用于显示用户信息
        try {
            const res = await userApi.getInfo();
            if (!res) { // 如果获取用户信息失败，抛出错误
                throw new Error('获取用户信息失败'); // 抛出错误
            }
            userInfo.value = res.data; // 设置用户信息
            return res;
        } catch (err) {
            clearUser(); // 清除用户信息，用于退出登录
            throw err; // 抛出错误
        }
    };

    const logout = async () => { // 退出登录，清除用户信息
        try {
            await userApi.logout(); // 退出登录，清除用户信息
            clearUser(); // 清除用户信息，用于退出登录
        } catch (err) {
            clearUser(); // 清除用户信息，用于退出登录
            throw err; // 抛出错误
        }
    };

    return {
        token, // 用户token，用于身份验证和权限控制
        avatar, // 用户头像，用于显示用户头像
        nickname, // 用户昵称，用于显示用户昵称
        roles, // 用户角色，用于权限控制
        username, // 用户账号，用于显示用户账号
        status, // 用户状态，用于显示用户状态
        userId, // 用户ID，用于标识用户
        routeData, // 路由表，用于显示菜单和路由
        userInfo, // 用户信息，用于显示用户信息
        login, // 登录，用于身份验证和权限控制
        getUserInfo, // 获取用户信息，用于显示用户信息
        logout, // 退出登录，清除用户信息
        clearUser, // 清除用户信息，用于退出登录
    }
})
